import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../common/services/index.dart';
import '../../../common/models/index.dart';
import '../../../common/mixins/index.dart';
import '../../../common/components/index.dart';
import '../../../common/utils/index.dart';
// ✅ 已移除 UserApi 导入 - 遵循6.2规范：所有API调用都通过Service层

/// 个人信息编辑页面控制器
/// 
/// 🎯 遵循企业级架构标准化：
/// - 所有API调用通过Service层（6.2规范）
/// - 使用UserProfileMixin访问用户信息（6.3规范）
/// - 遵循GetX控制器标准化结构（9个部分）
class PeofileDetialController extends GetxController with UserProfileMixin {
  // 1. 静态常量（类级别）- 使用lowerCamelCase命名
  static const String tag = 'PeofileDetialController';
  static const int maxRetryCount = 3;
  static const Duration updateTimeout = Duration(seconds: 10);
  
  // 2. 实例常量
  final String pageTitle = '编辑个人信息';
  final String welcomeMessage = '完善您的个人信息';
  
  // 3. 响应式变量（Rx系列）- 使用.obs写法（推荐95%场景）
  // 基础类型响应式变量
  var isLoading = false.obs;                    // RxBool - 加载状态
  var isSaving = false.obs;                     // RxBool - 保存状态
  var hasError = false.obs;                     // RxBool - 错误状态
  var hasChanges = false.obs;                   // RxBool - 是否有修改
  var errorMessage = ''.obs;                    // RxString - 错误信息
  
  // 🔄 移除本地响应式变量 - 直接从UserService获取数据
  // UI显示数据直接从UserService获取，不在Controller中缓存
  
  // 🎯 原始值记录（用于智能变更检测）
  String _originalNickName = '';
  String _originalEmail = '';
  String _originalPhone = '';
  
  // 头像相关响应式变量
  var selectedImagePath = ''.obs;               // RxString - 选中的本地图片路径
  var isLocalAvatar = false.obs;                // RxBool - 是否为本地头像
  var isUploadingAvatar = false.obs;            // RxBool - 是否正在上传头像
  
  // 可空类型响应式变量（特殊场景使用）
  var lastUpdateTime = RxnString();             // RxnString - 上次更新时间（可空）
  
  // 4. 普通变量（非响应式）
  bool _isInitialized = false;
  
  // 5. 控制器和服务依赖
  // 表单控制器
  final TextEditingController nickNameController = TextEditingController();
  final TextEditingController emailController = TextEditingController();
  final TextEditingController phoneController = TextEditingController();
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();
  
  // 服务依赖
  UserService get _userService => Get.find<UserService>();
  
  // 6. 构造函数
  PeofileDetialController() {
    debugPrint('$tag: Constructor - 控制器已创建 ${DateTime.now()}');
  }
  
  // 7. 私有初始化方法
  void _initData() {
    debugPrint('$tag: 初始化个人信息编辑页面数据');
    
    if (!_isInitialized) {
      // 检查用户登录状态
      _checkUserLoginStatus();
      
      // 加载用户信息
      _loadUserInfo();
      
      // 设置表单监听
      _setupFormListeners();
      
      // 设置已初始化标志
      _isInitialized = true;
      
      debugPrint('$tag: 页面数据初始化完成');
    }
    
    // 通知UI更新
    update(["profile_detial"]);
  }
  
  /// 检查用户登录状态
  void _checkUserLoginStatus() {
    final isLoggedIn = _userService.isLoggedIn;
    debugPrint('$tag: 用户登录状态检查 - isLoggedIn: $isLoggedIn');
    
    if (!isLoggedIn) {
      debugPrint('$tag: 用户未登录，返回上一页');
      _handleError('用户未登录');
      Get.back();
      return;
    }
  }
  
  /// 初始化表单控制器（从UserService获取数据）
  void _loadUserInfo() {
    try {
      debugPrint('$tag: 开始初始化表单控制器');
      
      final userProfile = currentUserProfile; // 直接从UserService获取
      if (userProfile != null) {
        
        debugPrint('$tag: 🔍 从UserService获取到的用户数据:');
        debugPrint('$tag:   📝 昵称: ${userProfile.nickName}');
        debugPrint('$tag:   📝 邮箱: ${userProfile.email}');
        debugPrint('$tag:   📝 手机: ${userProfile.phonenumber}');
        
        // 🎯 只更新表单控制器，不再维护本地响应式变量
        nickNameController.text = userProfile.nickName ?? '';
        emailController.text = userProfile.email ?? '';
        phoneController.text = userProfile.phonenumber ?? '';
        
        // 🎯 保存原始值用于智能变更检测
        _originalNickName = userProfile.nickName ?? '';
        _originalEmail = userProfile.email ?? '';
        _originalPhone = userProfile.phonenumber ?? '';
        
        debugPrint('$tag: 表单控制器初始化完成 - ${userProfile.nickName}');
        debugPrint('$tag: 🎯 UI显示数据直接从UserService获取，无需本地缓存');
        debugPrint('$tag: 📝 原始值已保存: nickName=$_originalNickName, email=$_originalEmail, phone=$_originalPhone');
      } else {
        debugPrint('$tag: 未找到用户信息');
        _handleError('未找到用户信息');
      }
      
    } catch (e) {
      debugPrint('$tag: 初始化表单控制器失败: $e');
      _handleError('加载用户信息失败');
    }
  }
  
  /// 设置表单监听器
  void _setupFormListeners() {
    debugPrint('$tag: 设置表单监听器');
    
    // 监听昵称变化
    nickNameController.addListener(() {
      _onFormChanged();
    });
    
    // 监听邮箱变化
    emailController.addListener(() {
      _onFormChanged();
    });
    
    // 监听手机号变化
    phoneController.addListener(() {
      _onFormChanged();
    });
    
    // 🎯 监听UserService用户信息变化，自动更新UI
    ever(_userService.currentUserProfileRx, (userProfile) {
      debugPrint('$tag: UserService用户信息发生变化，更新UI显示');
      update(["profile_detial"]);
    });
  }
  
  /// 表单内容变化处理
  void _onFormChanged() {
    debugPrint('$tag: 表单内容发生变化');
    // 🎯 使用智能变更检测
    hasChanges.value = hasAnyChanges;
    update(["profile_detial"]);
  }
  
  // 8. 业务方法
  
  // ==================== 用户信息访问 ====================
  // 注意：用户信息访问方法已通过 UserProfileMixin 提供
  // 可直接使用: currentUserProfile, userDisplayName, userName, nickName 等
  
  // 🎯 页面特定的数据访问器（如需要特殊处理的话）
  
  /// 获取用户显示名称（页面特定逻辑）
  String get displayName => userDisplayName;
  
  /// 获取用户手机号（页面特定逻辑）
  String get phone => userPhone;
  
  /// 获取用户邮箱（页面特定逻辑）
  String get email => userEmail;
  
  /// 获取性别文本（页面特定逻辑）
  String get sex => userSex;
  
  // ==================== 智能变更检测方法 ====================
  
  /// 🎯 检测用户信息变更，只返回真正改变的字段
  Map<String, String?> _detectChanges() {
    final changes = <String, String?>{};
    
    // 检测昵称变更
    final currentNickName = nickNameController.text.trim();
    if (currentNickName != _originalNickName) {
      changes['nickName'] = currentNickName;
      debugPrint('$tag: 🔍 检测到昵称变更: $_originalNickName → $currentNickName');
    }
    
    // 检测邮箱变更
    final currentEmail = emailController.text.trim();
    if (currentEmail != _originalEmail) {
      changes['email'] = currentEmail.isEmpty ? null : currentEmail;
      debugPrint('$tag: 🔍 检测到邮箱变更: $_originalEmail → $currentEmail');
    }
    
    // 检测手机号变更
    final currentPhone = phoneController.text.trim();
    if (currentPhone != _originalPhone) {
      changes['phonenumber'] = currentPhone.isEmpty ? null : currentPhone;
      debugPrint('$tag: 🔍 检测到手机号变更: $_originalPhone → $currentPhone');
    }
    
    debugPrint('$tag: 📊 变更检测完成 - 共检测到 ${changes.length} 个字段变更');
    if (changes.isEmpty) {
      debugPrint('$tag: 💡 没有任何字段发生变更');
    } else {
      debugPrint('$tag: 📝 变更字段: ${changes.keys.join(', ')}');
    }
    
    return changes;
  }
  
  /// 检查是否有任何变更
  bool get hasAnyChanges {
    final changes = _detectChanges();
    return changes.isNotEmpty;
  }
  
  // ==================== 表单验证相关方法 ====================
  
  /// 验证昵称
  String? validateNickName(String? value) {
    if (value == null || value.trim().isEmpty) {
      return '昵称不能为空';
    }
    if (value.trim().length < 2) {
      return '昵称至少2个字符';
    }
    if (value.trim().length > 20) {
      return '昵称不能超过20个字符';
    }
    return null;
  }
  
  /// 验证邮箱
  String? validateEmail(String? value) {
    if (value == null || value.trim().isEmpty) {
      return null; // 邮箱可以为空
    }
    
    final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$');
    if (!emailRegex.hasMatch(value.trim())) {
      return '请输入有效的邮箱地址';
    }
    return null;
  }
  
  /// 验证手机号
  String? validatePhone(String? value) {
    if (value == null || value.trim().isEmpty) {
      return null; // 手机号可以为空
    }
    
    final phoneRegex = RegExp(r'^1[3-9]\d{9}$');
    if (!phoneRegex.hasMatch(value.trim())) {
      return '请输入有效的手机号码';
    }
    return null;
  }
  
  // ==================== 头像选择相关方法 ====================
  
  /// 头像点击事件 - 显示选择底部弹出框
  void onAvatarTap() {
    debugPrint('$tag: 用户点击头像');
    _showAvatarSelectionBottomSheet();
  }
  
  /// 显示头像选择底部弹出框
  void _showAvatarSelectionBottomSheet() {
    ImagePickerBottomSheet.show(
      config: const ImagePickerConfig(
        title: '选择头像',
        cameraText: '拍照',
        galleryText: '从相册选择',
        maxWidth: 1080,
        maxHeight: 1080,
        imageQuality: 85,
      ),
      onImageSelected: (String imagePath) async {
        await _handleSelectedImage(imagePath);
      },
      onError: (String errorMessage, ImagePickerError? error) async {
        await _handleImagePickerError(errorMessage, error);
      },
    );
  }
  
  
  /// 处理选中的图片
  /// 
  /// 🎯 按照6.2规范：立即上传策略
  /// Controller → Service → API
  Future<void> _handleSelectedImage(String imagePath) async {
    try {
      debugPrint('$tag: 处理选中的图片 - $imagePath');
      
      // 显示上传进度
      isUploadingAvatar.value = true;
      update(["profile_detial"]);
      
      // 临时更新本地图片路径以显示预览
      selectedImagePath.value = imagePath;
      isLocalAvatar.value = true;
      
      // ✅ 调用Service层统一方法（Service会自动调用API并更新状态）
      debugPrint('$tag: 📤 调用Service层上传头像');
      final uploadResult = await _userService.uploadAndUpdateAvatar(imagePath);
      
      if (uploadResult.success && uploadResult.imgUrl != null) {
        // ✅ Service已自动更新用户信息，所有页面会自动同步
        debugPrint('$tag: ✅ 头像上传成功，Service已自动更新');
        debugPrint('$tag: 🎉 所有监听UserService的页面将自动刷新');
        
        // 清除本地预览状态
        isLocalAvatar.value = false;
        selectedImagePath.value = '';
        
        _showSuccessMessage('头像上传成功！');
        
      } else {
        // 上传失败，恢复原来的头像状态
        isLocalAvatar.value = false;
        selectedImagePath.value = '';
        
        _showErrorMessage(uploadResult.errorMessage ?? '头像上传失败，请重试');
        debugPrint('$tag: ❌ 头像上传失败 - ${uploadResult.errorMessage}');
      }
      
    } catch (e) {
      debugPrint('$tag: ❌ 处理图片失败: $e');
      
      // 恢复原来的头像状态
      isLocalAvatar.value = false;
      selectedImagePath.value = '';
      
      _showErrorMessage('处理图片失败，请重试');
    } finally {
      // 隐藏上传进度
      isUploadingAvatar.value = false;
      update(["profile_detial"]);
    }
  }
  
  /// 获取当前显示的头像路径
  String get currentAvatarPath {
    if (isLocalAvatar.value && selectedImagePath.value.isNotEmpty) {
      return selectedImagePath.value;
    }
    // 🎯 直接从UserService获取最新头像URL
    return _userService.currentUserProfile?.avatarUrl ?? '';
  }

  /// 处理图片选择错误
  Future<void> _handleImagePickerError(
    String errorMessage, 
    ImagePickerError? error,
  ) async {
    debugPrint('$tag: 处理图片选择错误 - $errorMessage');
    
    switch (error) {
      case ImagePickerError.permanentlyDenied:
        await _showPermissionSettingsDialog(errorMessage);
        break;
      case ImagePickerError.permissionDenied:
        _showErrorMessage(errorMessage);
        break;
      case ImagePickerError.noImageSelected:
        // 用户取消选择，不显示错误
        debugPrint('$tag: 用户取消选择图片');
        break;
      case ImagePickerError.deviceNotSupported:
        _showErrorMessage('设备不支持此功能');
        break;
      default:
        _showErrorMessage(errorMessage);
        break;
    }
  }

  /// 显示权限设置对话框
  Future<void> _showPermissionSettingsDialog(String message) async {
    final shouldOpenSettings = await Get.dialog<bool>(
      AlertDialog(
        title: const Text('需要权限'),
        content: Text(
          '$message\n\n操作步骤：\n'
          '1. 点击"前往设置"\n'
          '2. 找到应用权限\n'
          '3. 开启相应权限',
        ),
        actions: [
          TextButton(
            onPressed: () => Get.back(result: false),
            child: const Text('取消'),
          ),
          TextButton(
            onPressed: () => Get.back(result: true),
            child: const Text('前往设置'),
          ),
        ],
      ),
    ) ?? false;
    
    if (shouldOpenSettings) {
      final permissionService = Get.find<PermissionService>();
      await permissionService.openAppSettings();
    }
  }
  
  // ==================== 保存相关方法 ====================
  
  /// 保存用户信息
  /// 
  /// 🎯 按照6.2规范：批量保存策略
  /// Controller → Service → API
  Future<void> saveUserProfile() async {
    try {
      debugPrint('$tag: 开始保存用户信息');
      
      // 验证表单
      if (!formKey.currentState!.validate()) {
        debugPrint('$tag: 表单验证失败');
        return;
      }
      
      isSaving.value = true;
      hasError.value = false;
      update(["profile_detial"]);
      
      // 🎯 智能变更检测 - 只处理真正变更的字段
      final changes = _detectChanges();
      
      if (changes.isEmpty) {
        debugPrint('$tag: 💡 没有检测到任何变更，无需保存');
        _showInfoMessage('没有任何修改，无需保存');
        return;
      }
      
      debugPrint('$tag: 🚀 开始保存用户信息 - 智能变更模式');
      debugPrint('$tag: 📝 将只更新变更的字段: ${changes.keys.join(', ')}');
      
      try {
        // ✅ 调用Service层统一方法（Service会自动调用API并更新状态）
        debugPrint('$tag: 📤 调用Service层批量更新用户信息');
        
        final request = UpdateUserProfileReq.fromChanges(changes);
        await _userService.updateUserProfile(request);
        
        // ✅ Service已自动更新用户信息，所有页面会自动同步
        debugPrint('$tag: ✅ 用户信息更新成功，Service已自动更新');
        debugPrint('$tag: 🎉 所有监听UserService的页面将自动刷新');
        
        hasChanges.value = false;
        lastUpdateTime.value = DateTime.now().toString();
        
        _showSuccessMessage('个人信息保存成功');
        
        // 延迟返回上一页
        await Future.delayed(const Duration(milliseconds: 500));
        Get.back();
        
      } catch (e) {
        // ❌ Service调用失败
        debugPrint('$tag: ❌ Service调用失败: $e');
        _handleError('保存个人信息失败: ${e.toString()}');
      }
      
    } catch (e) {
      debugPrint('$tag: 保存用户信息异常: $e');
      _handleError('保存时发生错误');
    } finally {
      isSaving.value = false;
      update(["profile_detial"]);
    }
  }
  
  /// 重置表单
  void resetForm() {
    debugPrint('$tag: 重置表单');
    
    // 🎯 重新初始化表单控制器（从UserService获取最新数据）
    _loadUserInfo();
    
    // 重置状态
    hasChanges.value = false;
    hasError.value = false;
    errorMessage.value = '';
    
    update(["profile_detial"]);
    _showInfoMessage('表单已重置');
  }
  
  /// 返回上一页
  void onBackTap() {
    debugPrint('$tag: 用户点击返回');
    
    // 直接返回，不再显示确认对话框
    Get.back();
  }
  
  
  // ==================== 消息提示相关方法 ====================
  
  /// 显示成功消息
  void _showSuccessMessage(String message) {
    LoadingUtil.success(message);
  }
  
  /// 显示错误消息
  void _showErrorMessage(String message) {
    LoadingUtil.error(message, duration: const Duration(seconds: 3));
  }
  
  /// 显示信息消息
  void _showInfoMessage(String message) {
    LoadingUtil.info(message);
  }
  
  // ==================== 错误处理相关方法 ====================
  
  /// 处理错误
  void _handleError(String message) {
    hasError.value = true;
    errorMessage.value = message;
    
    debugPrint('$tag: 处理错误 - $message');
    _showErrorMessage(message);
    
    update(["profile_detial"]);
  }
  
  /// 重置错误状态
  void resetErrorState() {
    debugPrint('$tag: 重置错误状态');
    
    hasError.value = false;
    errorMessage.value = '';
    
    update(["profile_detial"]);
  }

  // 9. 生命周期方法
  @override
  void onInit() {
    super.onInit();
    debugPrint('$tag: onInit - 控制器初始化');
  }

  @override
  void onReady() {
    super.onReady();
    debugPrint('$tag: onReady - 页面准备就绪');
    _initData();
  }

  @override
  void onClose() {
    debugPrint('$tag: onClose - 控制器销毁');
    
    // 清理表单控制器
    nickNameController.dispose();
    emailController.dispose();
    phoneController.dispose();
    
    super.onClose();
  }
}
